/**
 * 格式化日期格式 (用于兼容ios Date对象)
 */
import {
	isExternal
} from "@/utils/verify.js"
import config from "@/core/config.js"
export const formatDate = (time, str = '/') => {
	// 将xxxx-xx-xx的时间格式，转换为 xxxx/xx/xx的格式
	return time.replace(/\-/g, str)
}
export const setImgUrl = (url) => {
	if (isExternal(url)) {
		return url
	} else {
		return config.baseUrl + '/dev-api' + url
	}
}
//版本号 补0
const repair = (str) => {
	if (str && str.length > 0) {
		const arr = str.split('.')
		const arr1 = arr.map(item => {
			if (item.length < 2) {
				return '0' + item
			}
		})
		return arr1.join('.')
	}
}
/**
 * 版本比大小 '1.0.0'
 */
export const versionFlag = (str1, str2) => {
	let s1 = repair(str1)
	let s2 = repair(str2)
	const v1 = Number(s1.replace(/\./g, ''))
	const v2 = Number(s2.replace(/\./g, ''))
	return v1 > v2
}
/**
 * 去除收尾全部空格
 */
export const Trim = (str) => {
	return str.replace(/(^\s*)|(\s*$)/g, '')
}
/**
 * 对象转URL
 * @param {object} obj
 */
export const urlEncode = (obj = {}) => {
	const result = []
	for (const key in obj) {
		const item = obj[key]
		if (isNaN(item)) {
			if (!item) {
				continue
			}
		}
		if (isArray(item)) {
			item.forEach(val => {
				result.push(key + '=' + val)
			})
		} else {
			result.push(key + '=' + item)
		}
	}
	return result.join('&')
}

/**
 * 遍历对象
 */
export const objForEach = (obj, callback) => {
	Object.keys(obj).forEach((key) => {
		callback(obj[key], key)
	})
}

/**
 * 是否在数组内
 */
export const inArray = (search, array) => {
	for (var i in array) {
		if (array[i] == search) return true
	}
	return false
}
// 将数字转为大写的中文字
export const numToCN = (a) => {
	if (typeof a == "number") {
		a = a.toString()
	}
	switch (a) {
		case "0":
			return "零";
			break;
		case "1":
			return "壹";
			break;
		case "2":
			return "贰";
			break;
		case "3":
			return "叁";
			break;
		case "4":
			return "肆";
			break;
		case "5":
			return "伍";
			break;
		case "6":
			return "陆";
			break;
		case "7":
			return "柒";
			break;
		case "8":
			return "捌";
			break;
		case "9":
			return "玖";
			break;
		case "10":
			return "拾";
			break;
		default:
			return ""
	}
}

/**
 * 对Date的扩展，将 Date 转化为指定格式的String
 * 月(Y)、月(m)、日(d)、小时(H)、分(M)、秒(S) 可以用 1-2 个占位符，
 * 例子：
 * dateFormat('YYYY-mm-dd HH:MM:SS', new Date()) ==> 2020-01-01 08:00:00
 */
export const dateFormat = (date, fmt = 'YYYY-mm-dd HH:MM:SS') => {
	if (typeof date === 'number') {
		date = new Date(date)
	}
	const opt = {
		'Y+': date.getFullYear().toString(), // 年
		'm+': (date.getMonth() + 1).toString(), // 月
		'd+': date.getDate().toString(), // 日
		'H+': date.getHours().toString(), // 时
		'M+': date.getMinutes().toString(), // 分
		'S+': date.getSeconds().toString() // 秒
		// 有其他格式化字符需求可以继续添加，必须转化成字符串
	}
	let ret
	for (let k in opt) {
		ret = new RegExp('(' + k + ')').exec(fmt)
		if (ret) {
			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
		}
	}
	return fmt
}
const formatNumber = (n) => {
	const s = n.toString()
	return s[1] ? s : '0' + s
}
export const formatTime = (timeAny, gap = "/") => {
	let date = null
	if (typeof(timeAny) == "number" || "string") {
		date = new Date(Number(timeAny))
	} else {
		date = timeAny
	}
	const year = date.getFullYear()
	const month = date.getMonth() + 1
	const day = date.getDate()
	const hour = date.getHours()
	const minute = date.getMinutes()
	const second = date.getSeconds()
	const nowDay = date.getDay()
	const weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
	const weeks1 = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
	const week = weeks[nowDay]
	const week1 = weeks1[nowDay]
	const timeDate = {
		year,
		month,
		day,
		time1: [year, month, day].map(formatNumber).join(gap) +
			' ' + [hour, minute].map(formatNumber).join(':'),
		week: week,
		week1: week1
	}
	return timeDate
}
/**
 * 判断是否为空对象
 * @param {*} object 源对象
 */
export const isEmptyObject = (object) => {
	return Object.keys(object).length === 0
}

/**
 * 判断是否为对象
 * @param {*} object
 */
export const isObject = (object) => {
	return Object.prototype.toString.call(object) === '[object Object]'
}

/**
 * 判断是否为数组
 * @param {*} array
 */
export const isArray = (array) => {
	return Object.prototype.toString.call(array) === '[object Array]'
}

/**
 * 判断是否为空
 * @param {*} object 源对象
 */
export const isEmpty = (value) => {
	if (isArray(value)) {
		return value.length === 0
	}
	if (isObject(value)) {
		return isEmptyObject(value)
	}
	return !value
}

/**
 * 对象深拷贝
 * @param {*} obj 源对象
 */
export const cloneObj = (obj) => {
	let newObj = isArray(obj) ? [] : {}
	if (typeof obj !== 'object') {
		return
	}
	for (let i in obj) {
		newObj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i]
	}
	return newObj
}

// 节流函数
// 思路： 第一次先设定一个变量true，
// 第二次执行这个函数时，会判断变量是否true，
// 是则返回。当第一次的定时器执行完函数最后会设定变量为flase。
// 那么下次判断变量时则为flase，函数会依次运行。
export function throttle(fn, delay = 100) {
	// 首先设定一个变量，在没有执行我们的定时器时为null
	var timer = null
	return function() {
		// 当我们发现这个定时器存在时，则表示定时器已经在运行中，需要返回
		if (timer) return
		timer = setTimeout(() => {
			fn.apply(this, arguments)
			timer = null
		}, delay)
	}
}

// 防抖函数
// 首次运行时把定时器赋值给一个变量， 第二次执行时，
// 如果间隔没超过定时器设定的时间则会清除掉定时器，
// 重新设定定时器， 依次反复， 当我们停止下来时，
// 没有执行清除定时器， 超过一定时间后触发回调函数。
// 参考文档：https://segmentfault.com/q/1010000021145192
export function debounce(fn, delay = 100) {
	let timer
	return function() {
		const that = this
		const _args = arguments // 存一下传入的参数
		if (timer) {
			clearTimeout(timer)
		}
		timer = setTimeout(function() {
			fn.apply(that, _args)
		}, delay)
	}
}

/**
 * 数组交集
 * @param {Array} 数组1
 * @param {Array} 数组2
 * @return {Array}
 */
export const arrayIntersect = (array1, array2) => {
	return array1.filter(val => array2.indexOf(val) > -1)
}

/**
 * 获取当前客户端的rpx比值
 * @return {Number}
 */
export const rpx = () => {
	const {
		windowWidth
	} = uni.getSystemInfoSync()
	// #ifdef H5
	// 与pages.json文件中的 rpxCalcMaxDeviceWidth参数对应, 请勿修改
	const rpxCalcMaxDeviceWidth = 750
	// 与pages.json文件中的 rpxCalcBaseDeviceWidth参数对应, 请勿修改
	const rpxCalcBaseDeviceWidth = 560
	const calcWindowWidth = windowWidth > rpxCalcMaxDeviceWidth ? rpxCalcBaseDeviceWidth : windowWidth
	return calcWindowWidth / 750
	// #endif
	// #ifndef H5
	return windowWidth / 750
	// #endif
}

/**
 * 获取当前客户端的rpx比值
 * @return {Number}
 */
export const rpx2px = (num) => {
	return num * rpx()
}
//说明：uniapp自带的复制功能是不支持h5的，所以需要单独处理
export const tocopy = () => {
	// #ifndef H5
	//除开h5之外的其他平台
	uni.setClipboardData({
		data: this.info.ordersn,
		success: function() {
			console.log('success')
		}
	})
	// #endif
	// #ifdef H5
	//h5平台
	let t = this
	uni.setClipboardData({
		data: this.info.ordersn,
		success: function(data) {
			t.api.toast('复制成功')
		},
		fail: function(err) {
			t.api.toast('复制失败')
		},
		complete: function(res) {
			t.api.toast('已复制')
		}
	})
	// #endif
}